// 应用配置管理工具

// 获取环境变量配置
const getEnvConfig = () => {
  return {
    // 基础配置
    NODE_ENV: process.env.NODE_ENV || 'development', // 环境模式
    PORT: process.env.PORT || 3000, // 端口号
    API_URL: process.env.API_URL || 'http://localhost:8080', // API地址
    DEBUG: process.env.DEBUG === 'true', // 调试模式
    BUILD_TIME: process.env.BUILD_TIME, // 构建时间
    
    // 应用配置
    APP_NAME: 'React应用', // 应用名称
    APP_VERSION: '1.0.0', // 应用版本
    
    // 功能开关
    FEATURES: {
      HOT_RELOAD: process.env.NODE_ENV === 'development', // 热重载
      DEBUG_MODE: process.env.DEBUG === 'true', // 调试模式
      API_PROXY: process.env.NODE_ENV === 'development', // API代理
    },
    
    // API配置
    API: {
      BASE_URL: process.env.API_URL || 'http://localhost:8080', // API基础地址
      TIMEOUT: 10000, // 请求超时时间
      RETRY_TIMES: 3, // 重试次数
    },
    
    // 本地存储配置
    STORAGE: {
      PREFIX: 'react_app_', // 存储前缀
      EXPIRY: 24 * 60 * 60 * 1000, // 过期时间（24小时）
    },
  };
};

// 获取当前配置
const config = getEnvConfig(); // 获取配置对象

// 配置验证函数
const validateConfig = () => {
  const errors = []; // 存储错误信息
  
  // 验证必需的环境变量
  if (!config.API_URL) {
    errors.push('API_URL 环境变量未设置'); // 添加错误信息
  }
  
  // 验证端口号
  if (isNaN(config.PORT) || config.PORT < 1 || config.PORT > 65535) {
    errors.push('PORT 必须是1-65535之间的数字'); // 添加错误信息
  }
  
  // 验证API地址格式
  try {
    new URL(config.API_URL); // 验证URL格式
  } catch (error) {
    errors.push('API_URL 格式不正确'); // 添加错误信息
  }
  
  return errors; // 返回错误数组
};

// 配置日志输出
const logConfig = () => {
  if (config.DEBUG) {
    console.group('🔧 应用配置信息'); // 开始配置组
    console.log('环境模式:', config.NODE_ENV); // 输出环境模式
    console.log('端口号:', config.PORT); // 输出端口号
    console.log('API地址:', config.API_URL); // 输出API地址
    console.log('调试模式:', config.DEBUG); // 输出调试模式
    console.log('构建时间:', config.BUILD_TIME); // 输出构建时间
    console.log('功能开关:', config.FEATURES); // 输出功能开关
    console.groupEnd(); // 结束配置组
  }
};

// 动态更新配置
const updateConfig = (updates) => {
  Object.assign(config, updates); // 合并配置更新
  console.log('✅ 配置已更新:', updates); // 输出更新信息
};

// 获取特定配置项
const getConfig = (key, defaultValue = null) => {
  const keys = key.split('.'); // 分割配置键
  let value = config; // 从根配置开始
  
  // 遍历配置键
  for (const k of keys) {
    if (value && typeof value === 'object' && k in value) {
      value = value[k]; // 获取嵌套配置值
    } else {
      return defaultValue; // 返回默认值
    }
  }
  
  return value; // 返回配置值
};

// 检查是否为开发环境
const isDevelopment = () => config.NODE_ENV === 'development'; // 检查开发环境

// 检查是否为生产环境
const isProduction = () => config.NODE_ENV === 'production'; // 检查生产环境

// 检查是否为测试环境
const isTest = () => config.NODE_ENV === 'test'; // 检查测试环境

// 获取API完整地址
const getApiUrl = (endpoint = '') => {
  const baseUrl = config.API.BASE_URL; // 获取基础地址
  const cleanEndpoint = endpoint.startsWith('/') ? endpoint.slice(1) : endpoint; // 清理端点
  return `${baseUrl}/${cleanEndpoint}`.replace(/\/+/g, '/'); // 返回完整地址
};

// 获取本地存储键名
const getStorageKey = (key) => `${config.STORAGE.PREFIX}${key}`; // 获取存储键名

// 导出配置和工具函数
export {
  config, // 配置对象
  getEnvConfig, // 获取环境配置
  validateConfig, // 验证配置
  logConfig, // 输出配置日志
  updateConfig, // 更新配置
  getConfig, // 获取配置项
  isDevelopment, // 检查开发环境
  isProduction, // 检查生产环境
  isTest, // 检查测试环境
  getApiUrl, // 获取API地址
  getStorageKey, // 获取存储键名
};

// 默认导出配置对象
export default config; 